package hw_8_1.reflect_Demo1;


import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 通过反射修改私有成员变量com.hspedu.homework  HomeworkO1.java
 * 1、定义PrivateTest类，有私有name属性，并且属性值为hellokitty
 * 2、提供getName的公有方法
 * 3、创建PrivateTest的类，利用Class类得到私有的name属性，修改私有的name属性值.
 * 4、并调用getName()的方法打印name属性值
 * 可以使用Java反射机制来实现修改私有成员变量的值和调用公有方法。
 */
class PrivateTest {
    private String name = "helloKitty";

    public String getName() {
        return name;
    }
}

public class Test{
    public static void main(String[] args) throws Exception {
        //获取PrivateTest的Class对象
        Class<?> clazz = Class.forName("hw_8_1.reflect_Demo1.PrivateTest");
        // 创建PrivateTest对象
        PrivateTest privateTest = (PrivateTest) clazz.getDeclaredConstructor().newInstance();
        // 获取私有的name成员变量
        Field name = clazz.getDeclaredField("name");
        //设置私有成员变量的可访问性
        name.setAccessible(true);
        //修改私有成员变量的值
        name.set(privateTest,"王二狗");
        //调用getName方法
        /**
         * getNameMethod是通过getMethod()方法获取的getName方法的Method对象。
         * 这里假设getName()是PrivateTest类中的公有方法。
         */
        Method getNameMethod = clazz.getMethod("getName");
        /**
         * 使用invoke()方法通过反射调用getNameMethod方法，传入privateTest对象作为调用的目标对象。
         * invoke()方法会执行getName()方法，并将返回的结果赋值给result变量。
         */
        Object result = getNameMethod.invoke(privateTest);
        //打印name属性值
        System.out.println(result);
    }

}
